/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "节点数据声明.h"




vec3 S_射线拾取参数::g相机位置 = {};
vec3 S_射线拾取参数::g开始射线 = {};
vec3 S_射线拾取参数::g结束射线 = {};
vec3 S_射线拾取参数::g手柄位置 = {};
vec3 S_射线拾取参数::g垂足坐标 = {};
vec3 S_射线拾取参数::g垂直线向量 = {};
vec3 S_射线拾取参数::g交点S = {};
vec3 S_射线拾取参数::g交点E = {};
float32 S_射线拾取参数::g垂直线长度 = 0;
float32 S_射线拾取参数::g开始交点距离 = 0;
float32 S_射线拾取参数::g结束交点距离 = 0;



S_Props	S_节点数据状态::g_打开编辑模式 = {};

S_Props S_节点数据状态::g_网格编辑模式 = {};
S_Props S_节点数据状态::g_骨骼编辑模式 = {};
S_Props S_节点数据状态::g_灯光编辑模式 = {};



uint64 S_节点数据::g_文件版本号 = 0 << 32 | 7;

uint64 S_节点数据::g_低版本号_0 = 0 << 32 | 0;
uint64 S_节点数据::g_低版本号_1 = 0 << 32 | 1;
uint64 S_节点数据::g_低版本号_2 = 0 << 32 | 2;
uint64 S_节点数据::g_低版本号_3 = 0 << 32 | 3;
uint64 S_节点数据::g_低版本号_4 = 0 << 32 | 4;
uint64 S_节点数据::g_低版本号_5 = 0 << 32 | 5;
uint64 S_节点数据::g_低版本号_6 = 0 << 32 | 6;
uint64 S_节点数据::g_低版本号_7 = 0 << 32 | 7;




std::vector<S_MapPtrItem> S_节点数据::g_物体节点树;
std::vector<S_MapPtrItem> S_节点数据::g_几何节点树;
std::vector<S_MapPtrItem> S_节点数据::g_渲染节点树;
std::vector<S_MapPtrItem> S_节点数据::g_函数节点树;
std::vector<S_MapPtrItem> S_节点数据::g_材质节点树;
std::vector<S_MapPtrItem> S_节点数据::g_着色节点树;
std::vector<S_MapPtrItem> S_节点数据::g_包节点树;

std::vector<std::vector<S_MapPtrItem>*> S_节点数据::g_节点树容器 = {
	& S_节点数据::g_物体节点树,
	& S_节点数据::g_几何节点树,
	& S_节点数据::g_渲染节点树,
	& S_节点数据::g_函数节点树,
	& S_节点数据::g_材质节点树,
	& S_节点数据::g_着色节点树,
	& S_节点数据::g_包节点树,
};


std::vector<C_节点树*> S_节点数据::g_根节点树;
std::vector<C_节点树*> S_节点数据::g_渲染根节点树;

C_节点树* S_节点数据::G当前包节点树 = nullptr;
C_节点树* S_节点数据::G当前物体节点树 = nullptr;
C_节点树* S_节点数据::G当前材质节点树 = nullptr;
C_节点树* S_节点数据::G当前着色节点树 = nullptr;
C_节点树* S_节点数据::G当前渲染节点树 = nullptr;

bool      S_节点数据::g_开启节点帧更新 = false;




std::map<std::wstring, E_值类型> S_节点数据::g_值类型名称映射 = {
	{L"i8",		E_值类型::e_Type_I8},
	{L"i32",	E_值类型::e_Type_I32},
	{L"ui32",	E_值类型::e_Type_UI32},
	{L"f32",	E_值类型::e_Type_F32},
	{L"f64",	E_值类型::e_Type_F64},
	{L"uvec2",	E_值类型::e_Type_uVec2},
	{L"vec2",	E_值类型::e_Type_Vec2},
	{L"vec3",	E_值类型::e_Type_Vec3},
	{L"vec4",	E_值类型::e_Type_Vec4},
	{L"ivec3",	E_值类型::e_Type_iVec3},
	{L"mat44",	E_值类型::e_Type_Mat4X4},

	{L"[ I8 ]",    E_值类型::e_Type_I8_1D},
	{L"[ I32 ]",   E_值类型::e_Type_I32_1D},
	{L"[ UI32 ]",   E_值类型::e_Type_UI32_1D},
	{L"[ F32 ]",   E_值类型::e_Type_F32_1D},
	{L"[ vec2 ]",  E_值类型::e_Type_Vec2_1D},
	{L"[ vec3 ]",  E_值类型::e_Type_Vec3_1D},
	{L"[ vec4 ]",	 E_值类型::e_Type_Vec4_1D},
	{L"[ ivec2 ]", E_值类型::e_Type_iVec2_1D},
	{L"[ ivec3 ]", E_值类型::e_Type_iVec3_1D},
	{L"[ mat44 ]", E_值类型::e_Type_Mat4X4_1D},

	{L"[ [UI32] ]",E_值类型::e_Type_UI32_2D},
	{L"[ [vec3] ]", E_值类型::e_Type_Vec3_2D},
	{L"[ [ivec3] ]", E_值类型::e_Type_iVec3_2D},

	{L"edge",     E_值类型::e_Type_多边形边},
	{L"[edge]",   E_值类型::e_Type_多边形边1D},
	{L"多边形",   E_值类型::e_Type_多边形},
	{L"[多边形]", E_值类型::e_Type_多边形_1D},

	{L"Mesh",	E_值类型::e_Type_Mesh},
	{L"[ Mesh ]",	E_值类型::e_Type_Mesh_1D},
	//{L"[tex]",	E_值类型::e_Type_纹理},
	{L"Ob",     E_值类型::e_Type_Object},
	{L"[Ob]",	E_值类型::e_Type_Object_1D},

	{L"多边形元素",	  E_值类型::e_Type_多边形元素},
	{L"[多边形元素]", E_值类型::e_Type_多边形元素1D},

	{L"纹理",         E_值类型::e_Type_纹理},
	{L"[纹理]",       E_值类型::e_Type_纹理1D},

	{L"材质",         E_值类型::e_Type_材质},
	{L"[材质]",       E_值类型::e_Type_材质1D},
};


//C_StrKey分配器	S_节点数据::g_纹理对象名称分配器;
C_StrKey分配器	S_节点数据::g_节点树名称分配器;
C_Key分配器		S_节点数据::g_着色器ID分配器;

C_Key分配器		S_节点数据::G_平行光ID;
C_Key分配器		S_节点数据::G_点光源ID;
C_Key分配器		S_节点数据::G_区域光ID;
C_Key分配器		S_节点数据::G_聚光灯ID;


S_摄像机*	S_节点数据::g_当前操作视口相机 = nullptr;
S_Props		S_节点数据::g_物理引擎视口互交 = f_alloc_BoolProp(nullptr, L"视口互交");
vec3		S_节点数据::g_视口鼠标点射线[2] = { {},{} };
S_物理互交参数 S_节点数据::g_视口物理互交参数 = { {}, {},{}, - 1 };


std::string S_节点数据::g_工程文件路径 = "";
std::string S_节点数据::g_工程文件名称 = "";
std::string	S_节点数据::g_工程文件节点代码路径;
std::string	S_节点数据::g_工程文件几何节点代码绝对路径;
std::string	S_节点数据::g_工程文件函数节点代码绝对路径;
std::string	S_节点数据::g_工程文件材质节点代码绝对路径;
std::string	S_节点数据::g_工程文件着色节点代码绝对路径;

std::string	S_节点数据::g_编译器路径 = "compiled/";

std::map<std::wstring, C_节点树*> S_节点数据::G用于重新映射节点树到节点的容器;





std::vector<S_物体*> S_节点数据::g_选中激活物体;
std::set<S_物体*>    S_节点数据::m_全局物体set;
std::set<S_物体*>    S_节点数据::m_独立物体set;

S_物体*                         S_节点数据::m_包围盒物体 = nullptr;

C_StrKey分配器		            S_节点数据::g_物体名称分配器;
std::map<std::wstring, S_物体*> S_节点数据::g_全局索引物体;



int32 S_节点数据::g_渲染帧编号 = 0;

std::string f_nodeCtx_相对路径补全(const std::string path) {
	std::string 拼接路径;
	if (path.size() > 2 && path.substr(0, 2) == "//") {
		拼接路径 = S_节点数据::g_工程文件路径 + path.substr(2, path.size() - 1);
	}
	else {
		return path;
	}
	return 拼接路径;
}
